Jak naplnit MemoryStream pomoci DLL?
Otázka od: little_bobes@centrum.cz
1. 7. 2004 7:49
Zdravim,
zacal jsem si hrat s knihovnami, lepe receno chci svou aplikaci rozsekat na
knihovny.
Ale ted jsem narazil na %subject%.
V hlavnim programu jsem si vytvoril TMemoryStream, ktery chci v DLL necim
naplnit a ve sve aplikaci chci s temito daty dale pracovat.
Vyzkousel jsem variantu i s runtime balicky, ale stale je nekde chyba.
hlavni program:
type
TMemStr = ^TMemoryStream;
TAKC = procedure (Output: TMemStr);
...
type
TForm1 = class(TForm)
private
AKC: TAKC;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
Hendl: THandle;
pomRes: TMemoryStream;
begin
Hendl := MyLoadLibrary;
If Hendl <> 0 then
begin
@AKC := GetProcAddress(Hendl, PChar('AKC'));
try
pomRes := TMemoryStream.Create;
If @AKC <> nil then AKC(@pomRes);
if pomRes.Size > 0 then ShowMessage(IntToStr(pomRes.Size));
finally
FreeAndNil(pomRes);
FreeLibrary(Hendl);
end;
end;
end;
DLL:
type
TMemStr = ^TMemoryStream;
...
procedure AKC(Output: TMemStr); stdcall;
begin
...
Output^.Clear; // access violation
...
end;
Poradite mi nekdo, v cem by mohla byt chyba nebo jak mam predavat ruzne
parametry do/z knihoven, abych nemusel runtime balicky pouzivat, pripadne
nejaky odkaz na net, kde by toto bylo obsahleji popsano?
Predem dekuji
Bob
(D4 c/s, FB 1.5)
Odpovedá: Daniel Rott
1. 7. 2004 8:26
> V hlavnim programu jsem si vytvoril TMemoryStream, ktery chci
> v DLL necim naplnit a ve sve aplikaci chci s temito daty dale pracovat.
Udelal bych to tak, ze hlavni aplikace by funkci v DLL predala adresu sve
procedury na zapis do streamu. Tato funkce by mela za parametry pointer a
pocet bajtu, funkce v DLL by jen ukazala na data ktera chce zapsat a zapsala
by si je sama aplikace => nebudou problemy s memory managerem, bude to
fungovat i bez balicku.
Daniel
---------------------------------------------------------------
Scanning complete: NO intelligent life form in range.
Odpovedá: Ondrej Kelle
1. 7. 2004 8:57
> hlavni program:
> type
> TMemStr = ^TMemoryStream;
> TAKC = procedure (Output: TMemStr);
Chyba Ti tam direktiva stdcall;
Objekty su pointre, takze staci predavat rovno TMemoryStream, nemusis
deklarovat TMemStr.
HTH
TOndrej